package gui.panel;

import gui.Fenster;
import gui.Konstanten;
import gui.NonEditableTableModel;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;

import steuerung.Controller;
import steuerung.data.Lager;

/**
 * Das LagerdetailsPanel zeigt alle Buchungen eines Lagers in einer Tabelle an
 * 
 * @author Wayne Fox
 */
public class LagerdetailsPanel extends JPanel implements Observer {

	private static final long serialVersionUID = 1615019654014022143L;

	private JLabel lbLagerdetailsName;
	private JLabel lbLagerdetailsBestand;
	private JTable tbBuchungen;
	private JButton btnLieferdetailsAnzeigen;

	private Fenster fenster;

	private Lager ausgewaehltesLager;

	/**
	 * Legt ein neues LagerdetailsPanel an
	 * 
	 * @param f Ein Fenster-Objekt zum Erstellen der Dialoge
	 */
	public LagerdetailsPanel(Fenster f) {
		fenster = f;
		initialisieren();

		Controller.getInstance().addModelObserver(this);
	}

	@Override
	/**
	 * 
	 */
	public void update(Observable o, Object arg1) {
		ausgewaehltesLager = Controller.getInstance().getAusgewaehltesLager();
		if (ausgewaehltesLager != null) {
			updateAusgewaehltesLager();
		}
	}

	private void initialisieren() {

		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

		// -------------------------------
		JPanel ldTopPanel = new JPanel();
		ldTopPanel.setMinimumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE, 20));
		ldTopPanel.setMaximumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE, 20));

		lbLagerdetailsName = new JLabel(
				Konstanten.LAGERDETAILS_LABEL_NAME_UNBEKANNT);
		ldTopPanel.add(lbLagerdetailsName);

		this.add(ldTopPanel);
		// -------------------------------
		JPanel ldMidPanel = new JPanel();
		ldMidPanel.setMinimumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 80));
		ldMidPanel.setMaximumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 80));
		ldMidPanel.setLayout(new GridLayout(1, 2));

		JLabel lbLagerdetailsBestandTitel = new JLabel(
				Konstanten.LAGERDETAILS_LABEL_BESTAND);
		lbLagerdetailsBestandTitel.setHorizontalAlignment(JLabel.LEFT);

		lbLagerdetailsBestand = new JLabel("0 "
				+ Konstanten.LAGERDETAILS_LABEL_BESTAND_EINHEIT);
		lbLagerdetailsBestand.setHorizontalAlignment(JLabel.RIGHT);

		ldMidPanel.add(lbLagerdetailsBestandTitel);
		ldMidPanel.add(lbLagerdetailsBestand);

		this.add(ldMidPanel);
		// -------------------------------
		JPanel ldMidTableLabelPanel = new JPanel(new GridLayout(1, 1));
		ldMidTableLabelPanel.setMinimumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 20));
		ldMidTableLabelPanel.setMaximumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 20));

		JLabel lbBuchungenTableBeschriftung = new JLabel(
				Konstanten.LAGERDETAILS_TABLE_TITEL);
		lbBuchungenTableBeschriftung.setHorizontalAlignment(JLabel.LEFT);

		ldMidTableLabelPanel.add(lbBuchungenTableBeschriftung);

		this.add(ldMidTableLabelPanel);
		// -------------------------------
		JPanel ldBotPanel = new JPanel(new GridLayout(1, 1));

		ldBotPanel.setMaximumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 100));

		tbBuchungen = new JTable(new NonEditableTableModel(
				Konstanten.LAGERDETAILS_TABLE_BESCHRIFTUNG));

		tbBuchungen.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tbBuchungen.setDefaultRenderer(Object.class,
				new DefaultTableCellRenderer() {

					private static final long serialVersionUID = 2351798808969363439L;

					@Override
					public int getHorizontalAlignment() {
						return JLabel.CENTER;
					}

				});

		JScrollPane spTableBuchungen = new JScrollPane(tbBuchungen);
		ldBotPanel.add(spTableBuchungen);

		this.add(ldBotPanel);
		// -------------------------------
		JPanel ldBotButtonPanel = new JPanel();

		ldBotButtonPanel.setMaximumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 20));

		btnLieferdetailsAnzeigen = new JButton(
				Konstanten.LAGERDETAILS_BUTTON_LIEFERDETAILSANZEIGEN);
		btnLieferdetailsAnzeigen.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent ev) {
				int reihe = tbBuchungen.getSelectedRow();
				if (reihe != -1) {
					String buchungsNummer = (String) tbBuchungen.getModel()
							.getValueAt(reihe, 0);

					Controller.getInstance().setAusgewaehlteBuchung(
							buchungsNummer);

					fenster.fokussiereLagerdetailsTab();
				} else {
					JOptionPane.showMessageDialog(fenster,
							Konstanten.LAGERDETAILS_MESSAGEDIALOG,
							Konstanten.LAGERDETAILS_MESSAGEDIALOG_TITLE,
							JOptionPane.DEFAULT_OPTION);
				}
			}

		});

		ldBotButtonPanel.add(btnLieferdetailsAnzeigen);

		this.add(ldBotButtonPanel);
		// -------------------------------
	}

	private void setzeLagerdetailsBestand(int bestand) {
		lbLagerdetailsBestand.setText(bestand + " "
				+ Konstanten.LAGERDETAILS_LABEL_BESTAND_EINHEIT);
	}

	private void setzeLagerdetailsName(String name) {
		if (name == null || name.equals("")) {
			lbLagerdetailsName
					.setText(Konstanten.LAGERDETAILS_LABEL_NAME_UNBEKANNT);
		} else {
			lbLagerdetailsName.setText(name);
		}
	}

	private void initialisiereLagerdetailsTableInhalt(Object[][] inhalt) {
		tbBuchungen.setModel(new NonEditableTableModel(inhalt,
				Konstanten.LAGERDETAILS_TABLE_BESCHRIFTUNG));
	}

	private void updateAusgewaehltesLager() {
		setzeLagerdetailsName(ausgewaehltesLager.toString());
		setzeLagerdetailsBestand(ausgewaehltesLager.getBestand());
		initialisiereLagerdetailsTableInhalt(Controller.getInstance()
				.getBuchungenAsArray(ausgewaehltesLager));
	}
}